package monitormercado.negocio.analise.estrategia;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import monitormercado.framework.Analise;
import monitormercado.framework.Conclusao;
import monitormercado.framework.Estrategia;
import monitormercado.framework.Sinal;
import monitormercado.negocio.Tick.ControladorTick;
import monitormercado.negocio.Tick.Tick;
import monitormercado.negocio.analise.indicador.Indicador;
import monitormercado.negocio.analise.indicador.MACD.GeradorMACD;
import monitormercado.negocio.analise.indicador.MACD.MACD;

public class EstrategiaMACDTripleScreen extends Estrategia {

	private int periodicidade = Indicador.PERIODICIDADE_SEMANAL;
	private int numeroDeAmostrasMedia = 12;
	private int numeroDeAmostrasLongo = 26;
	private int periodosLinhaSinal = 9;
	private static final String NOME = "MACD Triple Screen";
	
	public EstrategiaMACDTripleScreen() {
		super(NOME);
	}

	public EstrategiaMACDTripleScreen(int periodicidade, int numeroDeAmostrasMedia, int numeroDeAmostrasLonga, int periodosLinhaSinal) {
		super(NOME);
		this.periodicidade = periodicidade;
		this.numeroDeAmostrasMedia = numeroDeAmostrasMedia;
		this.numeroDeAmostrasLongo = numeroDeAmostrasLonga;
		this.periodosLinhaSinal = periodosLinhaSinal;
	}

	@Override
	public Analise identificarSinais(List<Tick> ticks, Date dataInicial, Date dataFinal) {
		Analise analise = new Analise();
		GeradorMACD gerador = new GeradorMACD();
		List<MACD> macds = gerador.gerarMACDHistorico(ticks, periodicidade, numeroDeAmostrasMedia, numeroDeAmostrasLongo, periodosLinhaSinal);

		 //TODO revisar
		 List<Tick> ticksSemanais =new ArrayList<Tick>();
		 for (Iterator iterator = ControladorTick.getIteratorUltimoDiaUtilSemana(ticks.iterator()); iterator.hasNext();) {
			Tick tick = (Tick) iterator.next();
			ticksSemanais.add(tick);
			
		}
		 
		MACD anterior = macds.get(0);
		for (MACD macd : macds) {
			Sinal sinal;
			if (macd.getValorDoHistograma() > anterior.getValorDoHistograma()) {
				sinal = new Sinal(getNome(), Conclusao.COMPRA, ticksSemanais.get(macds.indexOf(macd)));
				sinal.adicionarIndicador(macd);
				definirPesoCompra(macd,sinal);
				analise.incluirSinal(sinal, dataInicial, dataFinal);
			} else if (macd.getValorDoHistograma() < anterior.getValorDoHistograma()) {
				sinal = new Sinal(getNome(), Conclusao.VENDA, ticksSemanais.get(macds.indexOf(macd)));
				sinal.adicionarIndicador(macd);
				definirPesoVenda(macd, sinal);
				analise.incluirSinal(sinal, dataInicial, dataFinal);
			}
			
			anterior = macd;
		}
		
		return analise;
	}

	
	
	
	private void definirPesoCompra(MACD macd, Sinal sinal) {
		Integer peso = new Integer(1);
		/*if (macd.getValorDoHistograma() <0) {
			peso = Integer.valueOf((int)macd.getValorDoHistograma() * -10);			
		}*/
		sinal.setPeso(peso);
	}
	
	private void definirPesoVenda(MACD macd, Sinal sinal) {
		Integer peso = new Integer(1);
		/*if (macd.getValorDoHistograma() >0) {
			peso = Integer.valueOf((int)macd.getValorDoHistograma() * 10);			
		}*/
		sinal.setPeso(peso);
	}
	

	public int getPeriodicidade() {
		return periodicidade;
	}

	public void setPeriodicidade(int periodicidade) {
		this.periodicidade = periodicidade;
	}

	public int getNumeroDeAmostrasMedia() {
		return numeroDeAmostrasMedia;
	}

	public void setNumeroDeAmostrasMedia(int numeroDeAmostrasMedia) {
		this.numeroDeAmostrasMedia = numeroDeAmostrasMedia;
	}

	public int getNumeroDeAmostrasLongo() {
		return numeroDeAmostrasLongo;
	}

	public void setNumeroDeAmostrasLongo(int numeroDeAmostrasLongo) {
		this.numeroDeAmostrasLongo = numeroDeAmostrasLongo;
	}

	public int getPeriodosLinhaSinal() {
		return periodosLinhaSinal;
	}

	public void setPeriodosLinhaSinal(int periodosLinhaSinal) {
		this.periodosLinhaSinal = periodosLinhaSinal;
	}

}
